/**
 * Created with IntelliJ IDEA
 * Description
 * User:user
 * Date:2021-10-20
 * Time:14:32
 */

//构造方法是一种特殊的方法，没有返回值
//方法名和你的类名相同，没有返回值
    //this 和 supper
    //this表示当前对象的引用
    //this的使用方式：1。调用普通属性2.调用普通方法（不能调用用静态方法）3.调用构造方法，
//   //this()只能放在构造方法第一行，不能够构造两个出来，只能放到构造方法中进行调用不能放到普通放法进行调用
//this()不能自己调用自己，也不能嵌套调用则会直接报错
class Student{
    private String name;
    private int age;
    //构造方法是一种特殊的方法，没有返回值
    //方法名和你的类名相同，没有返回值
    //以前的类中没写这个构造方法，但是也不会报错，原因是因为当你没有写构造方法的时候，编译器会帮你生成一个n
    //不带参数的构造方法
    //当你写了任何一种构造方法，编译器就不会再帮你自动生成了，必须使用你写的方法
    //三个构造方法，任何调用一个，函数的重载，返回值不影响重载
    //根据参数决定调用哪个构造方法
    public  Student(){
        //this("bit");不能写两个 只能写一个，不同同时
        //this("bit",10);//this(参数)
        System.out.println("不带参数的构造方法");
    }
    public  Student(String name){
        this.name = name;
        System.out.println("带1个参数的构造方法");
    }
    //this表示的是当前对象的引用，开辟了空间，有了地址，但是没有实例化完成
    //书中的错误表示为当前对象，是因为实例化步骤没完成
    //构造方法没有返回值，void代表的是无返回值类型，也是一种类型，构造方法是没有返回值
    public  Student(String name,int age){
        //要加this 不加this形参和实参无法进行区分，功能无法实现4
        //存在即合理一定要规范
        this.name = name;
        this.age = age;
        System.out.println("带2个参数的构造方法");
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    public void sleep(){
        System.out.println(this.name+"sleep");
        System.out.println(this.getName());
    }
    public static void fun(){
        //System.out.println(this.name+"fun");错误写法因为是静态方法this表示的是引用对象
        //System.out.println(name+"fun");name也需要使用对象
    }
    public String toString(){
        return "name: "+this.name+"age:"+this.age;
    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Student student = new Student();
    }
    public static void main1(String[] args) {
        //实例化对象的两个步骤
        //1.为对象分配内存
        //2.调用合适的构造方法，意味着构造方法不止一个
        //上述两个步骤执行完才能真正实例化一个对象
        Student student1 = new Student();//调用不带参数的构造方法
        System.out.println(student1);
        Student student2 = new Student("bite");//调用带一个参数的构造方法
        System.out.println(student2);
        Student student3 = new Student("bite",18);//调用带两个参数的构造方法
        System.out.println(student3);
    }
}
